package com.dayuanit.dy17.mix.aop;

import com.dayuanit.dy17.mix.aop.service.IUserService;
import com.dayuanit.dy17.mix.aop.service.impl.PayServiceImpl;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test {
    public static void main(String[] args) {
        //Spring AOP 面向切面编程
        //AOP是对OOP(面向对象)的一次增强

        ApplicationContext context = new ClassPathXmlApplicationContext("spring-ioc.xml");
        IUserService userService = context.getBean(IUserService.class);

        //AOP在代理时，若目标类有接口，则默认使用JDK动态代理
        userService.login("tom", "111");
        userService.rigster();
        System.out.println(userService.getClass().getName());//com.sun.proxy.$Proxy8

        System.out.println("------------------------");


        //AOP在代理时，若目标类木有接口 则使用CGLib生成代理类
        PayServiceImpl payService = context.getBean(PayServiceImpl.class);
        payService.pay();
        System.out.println(payService.getClass().getName());//com.dayuanit.dy17.mix.aop.service.impl.PayServiceImpl$$EnhancerBySpringCGLIB$$19458c29


        // <aop:aspectj-autoproxy proxy-target-class="false />
        //若为false，则spring会做智能的选择代理方式，目标类有接口，走jdk代理；反之走CGLib代理；
        //若为true,则spring会全部走CGLib代理。
        //JDK和CGLib动态代理的区别：
        //1.JDK只能代理有接口的目标类，CGLib通吃。
        //2.创建代理类时：JDK 优于 CGLib
        //3.执行代理类时：CBLib 优于 JDK
    }
}
